<?php
/**
*  @package :  class.tool
*  @classID :  Image.class.php
*  @author  :  邝达峰
*  @date    :  2014-03-17
*  图片处理类
*/

class Image {
    
    private $arrConfig = array();   
	private $image_dir;#图片路径
	private $error;#图片错误
	private $IS_WATER_IMG = false;#是否打水印
	private $BUILD_IMG = NULL;#需要生成图片的配置
	private $imageBg = '#FFFFFF';#图片底色
	private $waterImage = './images/wlogo.png';#图片水印图片
	private $mWaterImage = './images/wmlogo.png';#中图水印图片

    	/**
   *  构造函数
   *  @param $image_dir 图片路径
   *  @param $max_size 图片大小
   *  @param $build 图片是否重建
   *  @return NULL
   *  @access public
   */
	public function __construct()
	{
		#设置内存
		@ini_set('memory_limit','128M');
        $this->arrConfig = Config::get('file');
	}
    

    
      /**
     * 取得图像信息
     * @static
     * @access public
     * @param string $image 图像文件名
     * @return mixed
     */
    static function getImageinfo($img){
        $imageInfo = getimagesize($img);
        if($imageInfo !== false){
            $imageType = substr($imageInfo['mime'],6);
            $imageSize = filesize($img);
            $info = array(
                "width" => $imageInfo[0],
                "height" => $imageInfo[1],
                "type" => $imageType,
                "size" => $imageSize,
                "mime" => $imageInfo['mime']
            );
            return $info;
        }else{
            return false;
        }
    }
    
    /**
   *  获得图文件扩展名
   *  @param $img 图片对象
   *  @return $extension
   *  @access public
   */
    static function getFileExtension($img){
    	return pathinfo($img,PATHINFO_EXTENSION);
    }
    
  	/**
   *  设置填充缩略图时的旁白的颜色
   *  @param $bgcolor 背景颜色
   *  @return NULL
   *  @access public
   */
	static function setImageBg($bgcolor){
		$this->imageBg = $bgcolor;
	}
    
	/**
   *  获得备份图文件名
   *  @param $img 图片对象
   *  @return $newImage
   *  @access public
   */
	static function getBakName($img){
		$extension = '.'.self::getFileExtension($img);
		$reduce_name = basename($img,$extension);
		return $reduce_name.'.bak'.$extension;
	}
    
    	/**
	 * 装载要处理的图片 
	 * @param $srcFile 图片路径
	 */
    static function &getImage($srcFile){
		$info = self::getImageinfo($srcFile);
		$fun = "imagecreatefrom".$info['type'];
        if(!function_exists($fun)){
            return false;
        }
        $im =  $fun($srcFile);
		return $im;
	}
    
    	/**
	*  获得新上传文件名称函数
	*  /s_x1_100.0222112837149563_349_313_10383.jpg
	*  存储beandb的编号 地理位置编号  存储时间 其他默认
	*  @param $name_old
	*  @return $name_new
	*  @access public
	*/
	static function getNewFileName($file)
	{
		$info = self::getImageinfo($file);
        $extension = $info['type'];
        $w = $info['width'];
        $h = $info['height'];
        $size = $info['size'];
        //$server = $this->arrConfig['IMG_SERVER'];
		$server = Config::get('file');
		$name   = $server['UPLOAD_SERVER_IDX'].'_'.$server['UPLOAD_LOC'].'.'.time();
		return $name."_".$w."_".$h."_".$size.".".$extension;
	}
    
    
    	/**
   *  生成缩略图函数
   *  @param $image 图片路径
   *  @param string $type 图像格式
   *  @param string $thumbname 缩略图文件名
   *  @param $maxWidth 图片宽度
   *  @param $maxHeight 图片高度
   *  @access public
   */
	static function getReduceImage($image,$type='',$maxWidth=200,$maxHeight=50,$thumbname=''){
		if($thumbname==""){
			$thumbname = '/'.self::getNewFileName($image);
		}
        $info = Image::getImageinfo($image);
        if($info !==false){
            $srcWidth = $info['width'];
            $srcHeight = $info['height'];
            $type = empty($type) ? $info['type'] : $type;
            $type = strtolower($type);
            unset($info);
            $scale = min($maxWidth / $srcWidth, $maxHeight / $srcHeight); // 计算缩放比例
            if ($scale >= 1) {
                // 超过原图大小不再缩略
                $width = $srcWidth;
                $height = $srcHeight;
            } else {
                // 缩略图尺寸
                $width = (int) ($srcWidth * $scale);
                $height = (int) ($srcHeight * $scale);
            }
            // 载入原图
            $createFun = 'ImageCreateFrom' . ($type == 'jpg' ? 'jpeg' : $type);
            if(!function_exists($createFun)) {
                return false;
            }
            $srcImg = $createFun($image);
            if($type != 'gif' && function_exists('imagescreatetruecoloc')){
                $thumbImg =  imagecreatetruecolor($width,$height);
            }else{
                $thumbImg = imagecreate($width,$height);
            }
            if($type =='png'){
                imagealphablending($thumbImg,false);//取消默认的混色模式（为解决阴影为绿色的问题）
                imagesavealpha($thumbImg,true);//设定保存完整的 alpha 通道信息（为解决阴影为绿色的问题）    
            }elseif($type=='gif'){
                $trnprt_indx = imagecolortransparent($srcImg);
                if($trnprt_indx>=0){
                    $trnprt_color = imagecolorsforindex($srcImg , $trnprt_indx);
                    $trnprt_indx = imagecolorallocate($thumbImg, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);
                    imagefill($thumbImg, 0, 0, $trnprt_indx);
                    imagecolortransparent($thumbImg, $trnprt_indx);
                }
            }
            
             // 复制图片
            if (function_exists("ImageCopyResampled"))
                imagecopyresampled($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth, $srcHeight);
            else
                imagecopyresized($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth, $srcHeight);

            // 生成图片
            $imageFun = 'image' . ($type == 'jpg' ? 'jpeg' : $type);
            $imageFun($thumbImg, $thumbname);
            imagedestroy($thumbImg);
            imagedestroy($srcImg);
            return $thumbname;
        
        }
    return false;
}

	/**
   *  图片中剪切部分图片函数
   *  @param $reduce_w,$reduce_h
   *  @return $name_reduce
   *  @access static
   *  $toW,$toH 为生成图片宽高，
   *  $dst 为(array) 
   * 	$dst[0] 为剪切部分左上角左边距与图片宽的例比
   * 	$dst[1] 为剪切部分左上角上边距与图片高的例比
   * 	$dst[2] 为剪切部分右下角左边距与图片宽的例比
   * 	$dst[3] 为剪切部分右下角上边距与图片高的例比
   */
	static function getCutImage($srcFile,$toW,$toH,$dst,$toFile="")
	{
		if($toFile=="") {
			$toFile = '/'.self::getNewFileName($image);
		}
		$im = &self::getImage($srcFile);
		$srcW=imagesx($im);
		$srcH=imagesy($im);
		$src_x = ceil($srcW*$dst[0]);
		$src_y = ceil($srcH*$dst[1]);
		$src_w=ceil($srcW*$dst[2])-$src_x;
		$src_h=ceil($srcH*$dst[3])-$src_y;

		if(function_exists("imagecreatetruecolor"))
		{
			@$ni = imagecreatetruecolor($toW,$toH);
			if($ni)
			{
				imagecopyresampled($ni,$im,0,0,$src_x,$src_y,$toW,$toH,$src_w,$src_h);
			}
			else
			{
				$ni=imagecreate($ftoW,$ftoH);
				imagecopyresized($ni,$im,0,0,$src_x,$src_y,$toW,$toH,$src_w,$src_h);
			}
		}
		else
		{
			$ni=imagecreate($ftoW,$ftoH);
			imagecopyresized($ni,$im,0,0,$src_x,$src_y,$toW,$toH,$src_w,$src_h);
		}
		if(function_exists('imagejpeg')) {
			imagejpeg($ni,$toFile);
		}
		elseif(function_exists('imagegif')) {
			imagegif($ni,$toFile);
		}
		else {
			imagepng($ni,$toFile);
		}
		imagedestroy($ni);
		imagedestroy($im);
		return str_replace(WEB_ROOT,'/',$toFile);
	}

	/**
   *  填充缩略图时的旁白
   *  @param NULL
   *  @return NULL
   *  @access public
   */
	static function imgFill($img,$toW,$toH)
	{
		$im = &self::getImage($img);
		$srcW=imagesx($im);
		$srcH=imagesy($im);
		$dst_x = 0;
		$dst_y = 0;

		if ($toW > $srcW)
		{
			$dst_x = ($toW-$srcW)/2;
		}
		if($toH > $srcH)
		{
			$dst_y = ($toH-$srcH)/2;
		}
		if($dst_x > 0 || $dst_y > 0)
		{
			if(function_exists("imagecreatetruecolor"))
			{
				@$ni = imagecreatetruecolor($toW,$toH);
				if(!$ni) $ni=imagecreate($toW,$toH);
			}
			else
			{
				$ni=imagecreate($toW,$toH);
			}
			$this->setBgColor($ni);
			imagecopy($ni,$im,$dst_x,$dst_y,0,0,$srcW,$srcH);
			if(function_exists('imagejpeg')) {
				imagejpeg($ni,$img);
			}
			elseif(function_exists('imagegif')) {
				imagegif($ni,$img);
			}
			else {
				imagepng($ni,$img);
			}
			imagedestroy($ni);
		}
		imagedestroy($im);
		return true;
	}

	/**
	 * 填充背景色
	 * @param $img  图片对象
	 */
	static function setBgColor(&$img)
	{
		$start_str = substr($this->imageBg,0,1) == '#' ? 1 : 0;
		$r = hexdec(substr($this->imageBg,0+$start_str,2));
		$g = hexdec(substr($this->imageBg,2+$start_str,2));
		$b = hexdec(substr($this->imageBg,4+$start_str,2));
		$color = imagecolorallocate($img, $r, $g, $b);
		imagefill($img, 0,0, $color);
	}

	/**
   *  为图片增加水印
   *  @param NULL
   *  @return NULL
   *  @access public
   */	
	static function water($img,$waterImg="",$waterText="",$waterPos=9,$bak=false)
	{
		if(empty($waterImg)) $waterImg = $this->waterImage;
		if($bak)
		{
			$bakImage = $this->getBakName($img);
			copy($img,$this->upload_dir.$bakImage);
		}
		$h = new Imagewater($img,$waterPos);
		if(file_exists($waterImg)){
			$h->setWaterImageInfo($waterImg);
		}
		else{
			$h->setWaterTextInfo($waterText);
		}
		if($h->groundImageHeight <= 50){
			$h->throwError("TooSmall");
		}
		else{
			$h->makeWater();
		}
	}

	

	/**
	 * 删除图片
	 * @param  $tbl 数据表名称
	 * @param  $where 查询条件
	 * @param  $colImg 图片字段名称
	 * @return null
	 */
	public static function delImg($tbl,$where='',$colImg='')
	{
		
	}

	/**
	 * 生成$_FILES值。
	 * @param $arrFile为数据格式为 array('下标名'=>'图片路径'...) 
	 */
	public function setFiles($arrFile)
	{
		if(is_array($arrFile))
		{
			foreach ($arrFile as $k=>$v)
			{
				if(is_array($v))
				{
					foreach($v as $k2=>$v2)
					{
						$arr_files[$k]['name'][$k2] = $v2;
						$arr_files[$k]['type'][$k2] = function_exists(mime_content_type)?mime_content_type($v2):('image/'.$this->getImageExtension($v2));
						$arr_files[$k]['size'][$k2] = filesize($v2);
						$arr_files[$k]['tmp_name'][$k2] = $v2;
						$arr_files[$k]['error'][$k2] = 0;
					}
				}
				else
				{
					$arr_files[$k]['name'] = $v;
					$arr_files[$k]['type'] = function_exists(mime_content_type)?mime_content_type($v2):('image/'.$this->getImageExtension($v2));
					$arr_files[$k]['size'] = filesize($v);
					$arr_files[$k]['tmp_name'] = $v;
					$arr_files[$k]['error'] = 0;
				}
			}
		}
		if(is_array($arr_files))
		{
			if($_FILES){
				$_FILES = array_merge($_FILES,$arr_files);
			}
			else{
				$_FILES = $arr_files;
			}
		}
	}
}
?>